package com.aps.server.mapper;

import com.aps.server.entity.BasicOperation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 工序信息 Mapper 接口
 * 继承 MyBatis Plus 的 BaseMapper，提供基础的 CRUD 操作
 */
@Mapper
public interface BasicOperationMapper extends BaseMapper<BasicOperation> {
    
    /**
     * 根据租户ID查询工序列表
     * 
     * @param tenantId 租户ID
     * @return 工序列表
     */
    @Select("SELECT * FROM basic_operation WHERE tenant_id = #{tenantId} ORDER BY sequence ASC, create_time DESC")
    List<BasicOperation> selectByTenantId(@Param("tenantId") String tenantId);
    
    /**
     * 根据租户ID分页查询工序列表
     * 
     * @param page 分页对象
     * @param tenantId 租户ID
     * @return 分页工序列表
     */
    @Select("SELECT * FROM basic_operation WHERE tenant_id = #{tenantId} ORDER BY sequence ASC, create_time DESC")
    IPage<BasicOperation> selectPageByTenantId(Page<BasicOperation> page, @Param("tenantId") String tenantId);
    
    /**
     * 根据工艺编码查询工序列表
     * 
     * @param craftId 工艺编码
     * @param tenantId 租户ID
     * @return 工序列表
     */
    @Select("SELECT * FROM basic_operation WHERE craft_id = #{craftId} AND tenant_id = #{tenantId} ORDER BY sequence ASC")
    List<BasicOperation> selectByCraftId(@Param("craftId") String craftId, @Param("tenantId") String tenantId);
    
    /**
     * 根据工艺编码分页查询工序列表
     * 
     * @param page 分页对象
     * @param craftId 工艺编码
     * @param tenantId 租户ID
     * @return 分页工序列表
     */
    @Select("SELECT * FROM basic_operation WHERE craft_id = #{craftId} AND tenant_id = #{tenantId} ORDER BY sequence ASC")
    IPage<BasicOperation> selectPageByCraftId(Page<BasicOperation> page, @Param("craftId") String craftId, @Param("tenantId") String tenantId);
    
    /**
     * 根据工序名称查询工序
     * 
     * @param operationName 工序名称
     * @param tenantId 租户ID
     * @return 工序信息
     */
    @Select("SELECT * FROM basic_operation WHERE operation_name = #{operationName} AND tenant_id = #{tenantId}")
    BasicOperation selectByOperationName(@Param("operationName") String operationName, @Param("tenantId") String tenantId);
    
    /**
     * 根据工序类型查询工序列表
     * 
     * @param operationType 工序类型
     * @param tenantId 租户ID
     * @return 工序列表
     */
    @Select("SELECT * FROM basic_operation WHERE operation_type = #{operationType} AND tenant_id = #{tenantId} ORDER BY sequence ASC, create_time DESC")
    List<BasicOperation> selectByOperationType(@Param("operationType") String operationType, @Param("tenantId") String tenantId);
    
    /**
     * 根据设备类型要求查询工序列表
     * 
     * @param equipmentTypeRequire 设备类型要求
     * @param tenantId 租户ID
     * @return 工序列表
     */
    @Select("SELECT * FROM basic_operation WHERE equipment_type_require = #{equipmentTypeRequire} AND tenant_id = #{tenantId} ORDER BY sequence ASC, create_time DESC")
    List<BasicOperation> selectByEquipmentTypeRequire(@Param("equipmentTypeRequire") String equipmentTypeRequire, @Param("tenantId") String tenantId);
    
    /**
     * 根据租户ID统计工序数量
     * 
     * @param tenantId 租户ID
     * @return 工序数量
     */
    @Select("SELECT COUNT(*) FROM basic_operation WHERE tenant_id = #{tenantId}")
    Long countByTenantId(@Param("tenantId") String tenantId);
    
    /**
     * 根据工艺编码统计工序数量
     * 
     * @param craftId 工艺编码
     * @param tenantId 租户ID
     * @return 工序数量
     */
    @Select("SELECT COUNT(*) FROM basic_operation WHERE craft_id = #{craftId} AND tenant_id = #{tenantId}")
    Long countByCraftId(@Param("craftId") String craftId, @Param("tenantId") String tenantId);
    
    /**
     * 根据工序类型统计工序数量
     * 
     * @param operationType 工序类型
     * @param tenantId 租户ID
     * @return 工序数量
     */
    @Select("SELECT COUNT(*) FROM basic_operation WHERE operation_type = #{operationType} AND tenant_id = #{tenantId}")
    Long countByOperationType(@Param("operationType") String operationType, @Param("tenantId") String tenantId);
}
